package Hilos;
import javax.swing.JLabel;

import Zombies.Zombie;
import Logica.Juego;
import Logica.Tablero;
import Graficas.Grafica;
import Humanos.Humano;

public class HiloZombie extends Thread{
	//ATRIBUTOS DE INSTANCIA
	protected Zombie zombie;
	protected Juego juego;
	protected Grafica grafica;
	
	//CONSTRUCTOR
	public HiloZombie(Juego j,Zombie z,Grafica g){
		zombie=z;juego=j;grafica=g;
		grafica.agregarZombie(zombie);
	}
	
	//COMANDOS
	private void moverZombie(){
		//ESTE METODO SE ENCARGA DE HACER AVANZAR AL ZOMBIE GRAFICAMENTE UN CASILLERO, ES DECIR, 100 PIXELES
		int limite=zombie.getPosX()-100;//ES EL VALOR HASTA EL CUAL DEBE MOVERSE PARA QUE SE DESPLAZE CORRECTAMENTE UN CASILLERO
		JLabel grafica=zombie.getGrafica();
		while((juego.sigueJuego())&&(zombie.getVida()>0)&&(limite<zombie.getPosX())){//MIENTRAS EL JUEGO SIGA, EL ZOMBIE ESTE VIVO Y NO LLEGUE A LA POSICION FINAL DEBE MOVERSE
			if(!juego.juegoEnPausa()){
				if((zombie.getPosX()-zombie.getVelocidad())<limite)
					zombie.setX(limite);
				else zombie.setX(zombie.getPosX()-zombie.getVelocidad());
				grafica.setLocation(zombie.getPosX(),zombie.getPosY());//SE UBICA EN LA POSICION CORRECTA CADA VEZ QUE SE MUEVE
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();}}
			else try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();}}		
	}
	public void run(){
		Tablero t=juego.getTablero();
		Humano h;//VARIABLE PARA REFERENCIAR AL HUMANO QUE SERA ATACADO
		while((juego.sigueJuego())&&(zombie.getVida()>0)){//MIENTRAS NO SE TERMINE EL JUEGO Y EL ZOMBIE ESTE VIVO DEBE SEGUIR EL HILO
			if(!juego.juegoEnPausa()){
				h=t.posicion(zombie.getFila(),zombie.getColumna());//SE FIJA SI HAY UN HUMANO EN EL MISMO CASILLERO DONDE SE ENCUENTRA EL ZOMBIE
				if(h!=null){//HAY UN HUMANO
					if(!h.estaInfectado())//CADA HUMANO PUEDE SER INFECTADO UNA VEZ
						zombie.infectar(h);}
				else{zombie.avanzar();//SI NO HAY UN HUMANO ENFRENTE, PUEDE SEGUIR AVANZANDO
				 	 moverZombie();}			
				if((zombie.getColumna()<0)&&(juego.sigueJuego())){//SIGNIFICA QUE LLEGO AL EXTREMO IZQUIERDO, EL JUEGO TERMINO
					juego.setSigueJuego(false);
					juego.FinDerrotaJuego();}
				if(!zombie.usoAtaqueEspecial())//ALGUNOS ZOMBIES TIENEN UN ATAQUE ESPECIAL
					zombie.ataqueEspecial();
				try {
					Thread.sleep(250);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();}}
			else try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();}}
			
		if(zombie.getVida()==0){//SI EL ZOMBIE MURIO, SE LO DEBE SACAR DEL TABLERO Y DE LA GRAFICA
				t.retirarZombie(zombie);
				zombie.morir();
				try {
					Thread.sleep(3000);//PARA QUE SE PUEDA VER EL GIF DE LA MUERTE DEL ZOMBIE
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();}
				grafica.retirarZombie(zombie);
				juego.incrementarDinero(zombie.getRecompensa());
				juego.incrementarPuntaje(zombie.getPuntaje());
				juego.incrementarZombiesMatados();}		
	}
}
